package 力扣;

/**
 给定一个二维的矩阵，包含 'X' 和 'O'（字母 O）。
 找到所有被 'X' 围绕的区域，并将这些区域里所有的 'O' 用 'X' 填充。
 示例:

 X X X X
 X O O X
 X X O X
 X O X X
 运行你的函数后，矩阵变为：
 X X X X
 X X X X
 X X X X
 X O X X
 解释:
 被围绕的区间不会存在于边界上，换句话说，任何边界上的 'O' 都不会被填充为 'X'。
 任何不在边界上，或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻，则称它们是“相连”的。

 */

public class _130被围绕的区域 {


    int m ;
    int n;
    public void solve(char[][] board) {
        if ( board == null && board[0].length ==0 ) return ;
        m = board.length;
        n =board[0].length;
        // 行
        for (int i = 0; i < board.length; i++) {
            dfs(board,i,0);
            dfs(board,i,n-1);
        }
        // 列
        for (int i = 0; i < board[0].length; i++) {
            dfs(board,0,i);
            dfs(board,m-1,i);
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if( board[i][j] == 'T') board[i][j] = 'O';
                else board[i][j] = 'X';
            }
        }

    }

    private void dfs(char[][] board, int r, int c) {

        if( r<0 || r>m || c<0 || c>n || board[r][c] != 'O' ) return;
        board[r][c] = 'T';
        dfs(board,r+1,c);
        dfs(board,r-1,c);
        dfs(board,r,c+1);
        dfs(board,r,c-1);
    }
}
